package main.java.aplicacion.usuarios.manejadores;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import main.java.aplicacion.ManejadorSistema;
import main.java.aplicacion.ManejadorSistemaError;
import main.java.aplicacion.juegos.entidades.Juego;
import main.java.aplicacion.usuarios.entidades.Cliente;
import main.java.aplicacion.usuarios.entidades.Desarrollador;
import main.java.aplicacion.usuarios.entidades.Usuario;
import main.java.aplicacion.usuarios.excepciones.UsuarioError;
import main.java.aplicacion.usuarios.interfaces.UsuariosMgt;
import main.java.datatypes.juegos.JuegoVO;
import main.java.datatypes.usuarios.ClienteVO;
import main.java.datatypes.usuarios.DesarrolladorVO;
import main.java.datatypes.usuarios.UsuarioVO;

public class UsuarioMgr implements UsuariosMgt {
	
	
	public void agregarUsuario(UsuarioVO dtUsuario) throws UsuarioError {
		
		if (dtUsuario.getMail() == null || dtUsuario.getMail().isEmpty()
				|| dtUsuario.getNick() == null || dtUsuario.getNick().isEmpty()) {
			throw new UsuarioError(UsuarioError.TipoError.USUARIO_INVALIDO);
		} else {
				ManejadorSistema ms = ManejadorSistema.getInstance();
				if((!ms.memberUsuarioPorNick(dtUsuario.getNick()))&&(!ms.memberUsuarioPorMail(dtUsuario.getMail()))){
					Usuario usuario;
					if (DesarrolladorVO.class.isInstance(dtUsuario))
						usuario = new Desarrollador(dtUsuario);
					else
						usuario = new Cliente(dtUsuario);
					ms.addUsuario(usuario);
				}
				else {
					throw new UsuarioError(
							UsuarioError.TipoError.USUARIO_YA_EXISTE);
				}
		}/**/
	}

	public List<UsuarioVO> listarUsuarios() {
		return ManejadorSistema.getInstance().listarUsuarios();
	}

	public void existeUsuario(String nick , String mail) throws UsuarioError {
		ManejadorSistema ms = ManejadorSistema.getInstance();
		if (mail.isEmpty() || nick.isEmpty()) {
			throw new UsuarioError(UsuarioError.TipoError.USUARIO_INVALIDO);
		}
	
		if (ms.memberUsuarioPorMail(mail) || ms.memberUsuarioPorNick(nick))
			throw new UsuarioError(UsuarioError.TipoError.USUARIO_YA_EXISTE);
	}

	public List<String> listarDesarrolladores() throws ManejadorSistemaError  {
		ManejadorSistema ms = ManejadorSistema.getInstance();
		return ms.listarDesarrolladores();
	}

	public List<String> listarClientes() {
		
		ManejadorSistema ms = ManejadorSistema.getInstance();
		return ms.listarClientes();
	}
	  

	/*public Desarrollador findDesarrollador(String nick) {

		List<Usuario> us = this.ususarios;
		ListIterator<Usuario> it = us.listIterator();
		while (it.hasNext()) {
			Usuario u = it.next();
			if ((Desarrollador.class.isInstance(u))
					&& (u.getNick().equals(nick)))
				return (Desarrollador) u;
		}
		return null;
	}

	public Cliente findCliente(String nick) {

		List<Usuario> us = this.ususarios;
		ListIterator<Usuario> it = us.listIterator();
		while (it.hasNext()) {
			Usuario u = it.next();
			if ((Cliente.class.isInstance(u)) && (u.getNick().equals(nick)))
				return (Cliente) u;
		}
		return null;
	}*/
	
	public UsuarioVO mostrarDatos(String nick) throws UsuarioError{
		ManejadorSistema ms = ManejadorSistema.getInstance();
		Usuario u = ms.findUsuarioPorNick(nick);
		if(nick.isEmpty()){
			throw new UsuarioError(UsuarioError.TipoError.USUARIO_INVALIDO);
		}else{
			if (u == null){
				throw new UsuarioError(UsuarioError.TipoError.USUARIO_NO_EXISTE);
			}else{	
				if (Desarrollador.class.isInstance(u)){
					return ((Desarrollador) u).toDesarrolladorVO();
				}else if (Cliente.class.isInstance(u)){
					return ((Cliente) u).toClienteVO();
				}else{
					throw new UsuarioError(UsuarioError.TipoError.USUARIO_INVALIDO);
				}
			}
		}
		
	}
	
	public void modificarPerfilUsuario(String nick, String correo, UsuarioVO du) throws UsuarioError{
		ManejadorSistema ms = ManejadorSistema.getInstance();
		Usuario u = ms.findUsuarioPorNick(nick);
		
		u.setNombre(du.getNombre());
		u.setApellido(du.getApellido());
		u.setEdad(du.getEdad());
		u.setFechaNacimiento(du.getFechaNacimiento());
		u.setImagen(du.getImagen());
		if(!(du.getContrasena() == null))
			u.setContrasena(du.getContrasena());
		
		if(DesarrolladorVO.class.isInstance(du)){
				((Desarrollador) u).setLink(((DesarrolladorVO) du).getLink());
		}
		if(!(nick.equals(du.getNick()))){
			if (ms.memberUsuarioPorNick(du.getNick())){
				throw new UsuarioError(UsuarioError.TipoError.USUARIO_YA_EXISTE);
			}
		
			else {
				u.setNick(du.getNick());
				}
		}
		if(!(correo.equals(du.getMail()))){
			if (ms.memberUsuarioPorMail(du.getMail())){
				throw new UsuarioError(UsuarioError.TipoError.USUARIO_YA_EXISTE);
			}
		
			else {
				u.setMail(du.getMail());
		}
		}
		
	}
	
	public void crearDesarrollador(String nick, String correo, String nombre, String apellido, String fecha, int edad, String url){
		String[] dma = fecha.split("/");
		Date date = java.sql.Date.valueOf(dma[2] + "-" + dma[1]+ "-" + dma[0]);
		UsuarioVO uvo = new DesarrolladorVO(nick, correo, nombre, apellido, date, edad, nick, url);
		try {
			agregarUsuario(uvo);
		} catch (UsuarioError e) {
			e.printStackTrace();
		}
	}
	public void crearCliente(String nick, String correo, String nombre, String apellido, String fecha, int edad){
		String[] dma = fecha.split("/");
		Date date = java.sql.Date.valueOf(dma[2] + "-" + dma[1]+ "-" + dma[0]);
		UsuarioVO uvo = new ClienteVO(nick, correo, nombre, apellido, date, edad, nick);
		try {
			agregarUsuario(uvo);
		} catch (UsuarioError e) {
			e.printStackTrace();
		}
	}
	public void crearDesarrollador(String nick, String correo, String nombre, String apellido, String fecha, int edad, String url, String password){
		String[] dma = fecha.split("/");
		Date date = java.sql.Date.valueOf(dma[2] + "-" + dma[1]+ "-" + dma[0]);
		UsuarioVO uvo = new DesarrolladorVO(nick, correo, nombre, apellido, date, edad, nick, url,password);
		uvo.setContrasena(password);
		try {
			agregarUsuario(uvo);
		} catch (UsuarioError e) {
			e.printStackTrace();
		}
	}
	public void crearCliente(String nick, String correo, String nombre, String apellido, String fecha, int edad, String password){
		String[] dma = fecha.split("/");
		Date date = java.sql.Date.valueOf(dma[2] + "-" + dma[1]+ "-" + dma[0]);
		UsuarioVO uvo = new ClienteVO(nick, correo, nombre, apellido, date, edad, nick,password);
		uvo.setContrasena(password);
		try {
			agregarUsuario(uvo);
		} catch (UsuarioError e) {
			e.printStackTrace();
		}
	}
	
	public List<String> listarJuegosAprobadosDesarrollador(String nick) throws UsuarioError{

			return ManejadorSistema.getInstance().listarJuegosAprobadosDesarrollador(nick);		
	}
	
	public List<String> listarJuegosPublicadosDesarrollador(String nick) throws UsuarioError{

		return ManejadorSistema.getInstance().listarJuegosPublicadosDesarrollador(nick);		
}

	@Override
	public boolean existeUsuarioNick(String nick) {
		ManejadorSistema ms = ManejadorSistema.getInstance();
		return ms.memberUsuarioPorNick(nick);
	}

	@Override
	public boolean existeUsuarioCorreo(String correo) {
		ManejadorSistema ms = ManejadorSistema.getInstance();
		return ms.memberUsuarioPorMail(correo);
	}
	
//	public List<JuegoVO> getJuegosAprobadosDesarrollador(String nick) throws UsuarioError{
//		return ManejadorSistema.getInstance().getJuegosAprobadosDesarrollador(nick);		
//	}
}
